在 Python 中,函數是一種將代碼組織起來並重複使用的方式。遞迴則是一種特殊的函數調用方式,允許函數自己調用自己來解決問題。這篇文章將介紹函數、區域與全域變數,以及遞迴。
函數是可以重複使用的代碼塊,用來執行某些操作或返回結果。使用函數可以提高代碼的可讀性和可維護性。
在 Python 中,函數使用 def
關鍵字來定義。函數可以接受參數,並且可以返回值。
範例:
def greet(name):
return f"Hello, {name}!"
這個函數名為 greet
,接受一個參數 name
,並返回一個格式化的字串。可以這樣調用它:
message = greet("Alice")
print(message) # 輸出:Hello, Alice!
函數可以接受多個參數,並且可以根據需要返回一個或多個值。
範例:
def add(a, b):
return a + b
這個函數接受兩個參數 a
和 b
,返回它們的和。使用範例:
result = add(3, 5)
print(result) # 輸出:8
函數還可以為參數設置預設值,當調用函數時,如果沒有傳入對應的參數,則使用預設值。
範例:
def greet(name="Guest"):
return f"Hello, {name}!"
這裡 name
的預設值是 "Guest"
,如果沒有提供參數,則輸出為:
print(greet()) # 輸出:Hello, Guest!
在 Python 中,變數的作用範圍決定了它能在哪些地方被訪問。變數的作用範圍可以分為兩種類型:區域變數和全域變數。
區域變數是在函數內部定義的變數,作用範圍僅限於函數內部。當函數執行完畢後,區域變數會被銷毀,無法在函數外部使用。
範例:
def my_function():
x = 10 # x 是區域變數
print(x)
my_function() # 輸出:10
# print(x) # 這會產生錯誤,因為 x 是區域變數,函數外部無法訪問
全域變數是在函數外部定義的變數,可以在程式的任何地方訪問。若要在函數內部修改全域變數,則需要使用 global
關鍵字。
範例:
x = 10 # 全域變數
def my_function():
global x
x = 20 # 修改全域變數
print(x)
my_function() # 輸出:20
print(x) # 輸出:20,因為全域變數已被修改
在這裡,我們使用 global
關鍵字來告訴 Python,函數內部的 x
是全域變數。
遞迴是一種特殊的函數調用方式,指的是函數自己調用自己。通常遞迴用來解決問題的子問題,例如分解大的問題為較小的相似問題。使用遞迴時,必須設置停止條件,否則會陷入無限遞迴。
遞迴函數的基本結構包含兩部分:
範例:計算階乘(n!
)
def factorial(n):
if n == 1: # 基本情況
return 1
else:
return n * factorial(n - 1) # 遞迴調用
這個遞迴函數計算一個數字的階乘。階乘的定義為 n! = n * (n-1) * (n-2) * ... * 1
,且 1! = 1
是終止條件。
範例調用:
result = factorial(5)
print(result) # 輸出:120
在這裡,factorial(5)
會調用 factorial(4)
,然後調用 factorial(3)
,直到 factorial(1)
,此時返回 1,然後返回結果依次相乘。
優點:
缺點:
斐波那契數列是一個經典的遞迴範例,其定義為:
F(0) = 0, F(1) = 1
F(n) = F(n-1) + F(n-2)
範例:
def fibonacci(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fibonacci(n-1) + fibonacci(n-2)
範例調用:
print(fibonacci(6)) # 輸出:8
這個遞迴函數會計算第 n
個斐波那契數,其中 fibonacci(6)
會依次調用 fibonacci(5)
、fibonacci(4)
,直到計算出最終結果。
函數在程式設計中提供了重用代碼的能力,並通過局部與全域變數的區分來控制變數的範圍。遞迴是一種強大的工具,可以用來解決那些可以分解為子問題的複雜問題。雖然遞迴可以簡化代碼,但必須謹慎使用,以防止效能問題和無限遞迴的發生。